/*
 *  Copyright 2013 Utkin Dmitry
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

#ifndef PROTOQTRPC_LOCATION_RPCCHANNEL_H
#define PROTOQTRPC_LOCATION_RPCCHANNEL_H

#include <QString>
#include <QHostAddress>
#include <protoqtrpc/SocketRpcChannel.h>

namespace google {
namespace protobuf {
class ServiceDescriptor;
}
}

namespace protoqtrpc {
namespace location {

class LocationServiceClient;

class LocationRpcChannel: public SocketRpcChannel
{
public:
    /**
     * @brief Constructs empty RpcChannel.
     * To find and connect to a service use connectToService.
     *
     * @sa connectToService()
     */
    LocationRpcChannel();

    /**
     * @brief Constructs RpcChannel.
     * Constructs RpcChannel to connect to a service found using LocationService.
     * If some/both of serviceHost/channelId are not set take first matching service.
     *
     * Example:
     *   protoqtrpc::location::RpcChannel channel(EchoService::descriptor());
     *   EchoService::Stub client(&channel);
     *
     * @param descriptor Descriptor of the service
     * @param serverName Name of the server where this service is registered
     * @param locationServiceHost Host on which LocationService is started
     * @param locationServicePort Port on which LocationService is started
     * @sa connectToService()
     */
    LocationRpcChannel(const ::google::protobuf::ServiceDescriptor* descriptor,
               const QHostAddress& serviceHost = QHostAddress::Any,
               const QString& serverName = QString(),
               const QHostAddress& locationServiceHost = QHostAddress::LocalHost,
               quint16 locationServicePort = 0);

    /**
     * @brief Destroys the channel
     */
    virtual ~LocationRpcChannel();

    /**
     * @brief Connect to service
     * Connects RpcChannel to a service found using LocationService.
     * If some/both of serviceHost/channelId are not set take first matching service.
     *
     * Example:
     *   protoqtrpc::location::RpcChannel channel;
     *   EchoService::Stub client(&channel);
     *   channel.connectToService(client.descriptor());
     *
     * @param descriptor Descriptor of the service
     * @param serverHost Host on which stared a server where to search a service
     * @param serverName Name of the server where this service is registered
     * @param locationServiceHost Host on which LocationService is started
     * @param locationServicePort Port on which LocationService is started
     */
    bool connectToService(const ::google::protobuf::ServiceDescriptor* descriptor,
                          const QHostAddress& serverHost = QHostAddress::Any,
                          const QString& serverName = QString(),
                          const QHostAddress& locationServiceHost = QHostAddress::LocalHost,
                          quint16 locationServicePort = 0);
private:
    LocationServiceClient* mClient;
};

}
}

#endif
